home *** CD-ROM | disk | FTP | other *** search
/ Spanish Scene 1 / SpanishScene1.iso / spanish pack n°1 by llfb / revistas / amigadreams / adreams07-2.dms / adreams07-2.adf / 038 < prev    next >
Text File  |  1995-06-30  |  6KB  |  190 lines

  1. P8------------------------------------
  2. "RUTINILLA DE FADE"
  3. ------------------------------------
  4.  
  5. P?El  FADE se usa cuando queremos  que los colores de la pantalla hagan una
  6. transición  suave  hasta convertirse en  otros  diferentes,  me  atrevo a
  7. decir  que se usa en casi toda  demo. Bueno, no me enrollo más, explicaré
  8. por   encima  como  se  programa   el efecto  y como se usa mi rutina, mi
  9. rutina   no es que sea nada del otro mundo, la hice hace 1 año lo menos y
  10. seguramente  se  pueden optimizar un montón  de  cosas, pero , ¿pa qué me
  11. voy a pringar?
  12.  
  13. Bueno, al grano, decía antes que de lo  que  se   trata es de pasar de un
  14. conjunto  de colores (paleta) a otro lo  más  suavemente  posible,  bien,
  15. pues    entonces   necesitamos   dos paletas:
  16.  
  17.  -  una origen   (que será la que en ese momento se vea en pantalla)
  18.  
  19.  -  otra destino (que ser en la que se convierta la de origen)
  20.  
  21.  
  22. Lo  importante  de  la  rutina  viene ahora, la rutina tiene que coger el
  23. mismo   color   en   cada  paleta  y compararlos, y según eso oscurecer o
  24. aclarar  el color, iré poniendolo en pseudocódigo sencillo y luego iremos
  25. haciendo  el  código mas complicado: En principio sería algo asi: 
  26.  
  27.   - coger color X de la paleta origen. (1)
  28.   - Coger color X de la paleta destino. (2)
  29.   - Compararlos:
  30.   * Si (1) y (2) son iguales se termina la rutina
  31.   * Si el (1) > (2) entonces disminuir el (1)
  32.   * Si el (1) < (2) entonces aumentar el (1)
  33.   - Volver a comparar
  34.  
  35. Vale,  muy  bonito,  pero  ¿ como se sabe  si  un  color es mayor o menor
  36. que otro ?
  37.  
  38. Pues bien, los colores en el Amiga (me estoy  refiriendo  a  maquinas  NO
  39. AGA)  se  definen  mediante  3  valores,  los   famosos   RGB ,  entonces
  40. para saber si un color es "mayor" que otro , lo que hay que hacer  es  ir 
  41. comparando el valor RED de un color con el del otro, luego por otra parte 
  42. el Valor GREEN, y luego el valor BLUE, entonces  disminuimos o aumentamos 
  43. cada valor RGB por separado, asi que  nuestro  programa  en  pseudocódigo 
  44. quedará asi:
  45.  
  46. - Coger el color X de la paleta origen. (1)
  47. - Coger el color X de la paleta destino. (2)
  48. - Si (1) y (2) son iguales se acabó
  49. - Coger valor RED del (1) y compararlo con valor RED del (2)
  50.  
  51.   * si RED(1) = RED(2) Pasamos a comparar el valor GREEN
  52.   * si RED(1) > RED(2) THEN disminuir RED(1)
  53.   * si RED(1) < RED(2) THEN aumentar RED(1)
  54.  
  55. Repetir el proceso anterior pero ahora cogiendo el valor GREEN y
  56. después con el valor BLUE.
  57.  
  58. Bueno, eso es toda la rutina,  no  tiene  mucho  misterio,  sólo me falta
  59. decir por si alguien anda despitado que para  coger  el  valor RED  o  el
  60. GREEN o el BLUE, tenemos  que  usar  las  mascaras,  es decir, la función
  61. lógica AND, un ejemplillo:
  62.  
  63. - Supongamos el color 3 que tiene un valor $67B (hexadecimal)
  64.  
  65.       RGB
  66.  
  67. - si queremos  sacar  el  valor  RED,  tendremos  que  enmascarar el byte
  68. inferior (vamos los valores G Y B)
  69.  
  70.       move.w  #$67B,d0
  71.       and.w   #$F00,d0
  72.  
  73.       d0 sería ahora #$600
  74.  
  75. Como se ve hemos "filtrado" el valor RED.Con  esto  sacariamos  el  valor 
  76. BLUE:
  77.  
  78.      move.w   #$37B,d0
  79.      and.w    #$00F,d0
  80.  
  81.      d0 = sería ahora #$00B
  82.  
  83.  
  84. Bueno,  ahora  comentaré   un  poco mi rutina,  sigue    exactamente   el
  85. pseudocódigo  que  he propuesto pero tiene  dos  o  tres  cosas añadidas,
  86. cosas  necesarias,  por  ejemplo, un bucle  para  que  el  color  X  vaya
  87. tomando  todos  los  valores  de  la paleta mediante un bucle, y que está
  88. adaptada  para  que la paleta origen sea  una direccion  de la copperlist
  89. la  dirección donde está el trozo de copperlist   que   se   encarga   de
  90. escribir  a  los  registros de color del Amiga.
  91.  
  92. La paleta destino es simplemente una serie de words con  los  valores RGB
  93. de cada color de la paleta.
  94.  
  95. Decir también, que para que tengamos un  fade  completo,  una  transición
  96. completa tendremos que llamar a la  rutina  15  veces  como mínimo,eso es
  97. porque las componentes RGB  van  de  0  a  15, ¡ está claro !. Otra cosa,
  98. para sacarle el máximo partido  a  la  rutina es mejor llamarla dentro de
  99. la interrupción del Vblank, así lo  hago  yo  y  gracias a ello mi marido
  100. ha dejado de roncar ;-)
  101.  
  102. Bueno, por último, la rutina:
  103.  
  104.  
  105. P<
  106. ; -------------------------------------------------------------
  107. ;   FadeXele.sub
  108. ; -------------------------------------------------------------
  109. ;  » Fade_First.w   =  Color inicial
  110. ;  » Fade_Last.w    =  Color final
  111. ;  » Fade_Copper.l  =  Direccion tabla de colores en la copperlist 
  112. ;                      que tienen que ser fadeados
  113. ;  » Fade_Table.l   =  Direccion tabla de colores a los que hay
  114. ;                      que llegar con el fade
  115. ; -------------------------------------------------------------
  116.  
  117. FadeXele    ; (llamar 15 veces para un fade completo)
  118.  
  119.     movem.l    d0-d7/a0-a6,-(sp)
  120.     move.l    fade_copper,a0
  121.     move.l    fade_table,a1
  122.     move.w    fade_first,d0
  123.     move.w    fade_last,d1
  124.  
  125. fadeloop
  126.  
  127.     move.w    d0,d2        ;d0 = indica que color estamos fadeando
  128.     lsl    #2,d2        ;se multipli. por 4 para sacar de copperlist
  129.     move    2(a0,d2),d6    ;d6 = color en copper
  130.     lsr    #1,d2        ;se averigua el offset para la tabla
  131.     move    0(a1,d2),d7    ;d7 = color en table
  132.      cmp    d6,d7        ;comparamos los colores
  133.     beq    nextcolor    ;si ya son iguales saltamos al siguiente
  134.  
  135. .red    move.w    d6,d4        ;guardamos el c. copper
  136.     move.w    d7,d5        ;guardamos el c. table
  137.  
  138.     and.w    #$0f00,d4    ;separo componente rojo
  139.     and.w    #$0f00,d5    ;en ambos colores
  140.     cmp.w    d4,d5        ;comparo ambas componentes
  141.     beq    .green        ;si son iguales saltamos a comp. verde
  142.     blt    .menosred    
  143.     add.w    #$100,d6
  144.     bra    .green
  145. .menosred
  146.     sub.w    #$100,d6
  147.  
  148. .green    move.w    d6,d4        ;guardamos c. copper
  149.     move.w    d7,d5        ;guardamos c. table
  150.  
  151.     and.w    #$00f0,d4    ;separo componente verde
  152.     and.w    #$00f0,d5    ;en ambos colores
  153.     cmp.w    d4,d5        ;comparo las componentes
  154.     beq    .blue        ;sin son iguales salto a comp. azul
  155.     blt    .menosgreen
  156.     add.w    #$010,d6
  157.     bra    .blue
  158. .menosgreen
  159.     sub.w    #$010,d6
  160.  
  161. .blue    move.w    d6,d4        ;guardamos c. copper
  162.     move.w    d7,d5        ;guardamos c. table
  163.  
  164.     and.w    #$000f,d4    ;separo componente azul
  165.     and.w    #$000f,d5    ;en ambos colores
  166.     cmp.w    d4,d5        ;comparo las componentes
  167.     beq    copiacolor    ;si son iguales salto a siguiente color
  168.     blt    .menosblue
  169.     add.w    #$001,d6
  170.     bra    copiacolor
  171. .menosblue
  172.     sub.w    #$001,d6
  173.  
  174. copiacolor
  175.     lsl.w    #1,d2        ;muls. por 4
  176.     move.w    d6,2(a0,d2)    ;copiamos el color fadeado a c. en copper
  177. nextcolor
  178.     cmp.w    d0,d1        ;compara si el indice = ultimo
  179.     beq    salirfade
  180.     add.w    #1,d0        ;aumentar el indice
  181.     bra    fadeloop
  182. salirfade
  183.     movem.l    (sp)+,d0-d7/a0-a6
  184.     rts
  185.  
  186. fade_copper    dc.l    0
  187. fade_table    dc.l    0
  188. fade_first    dc.w    0
  189. fade_last    dc.w    0
  190.